﻿using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Reflection;

namespace Maestro_Proveedores.herramientas
{
    /// <remarks>
    /// Esta calse tiene la responsabilidad de asegurar el acceso a los formualrios de la aplicacion, 
    /// ademas de permitir la navegacion entre estos.
    /// </remarks>
    public class Redirect
    {
        /// <summary>
        /// lista de formularios registrados.
        /// </summary>
        private static ArrayList formulariosInParent = new ArrayList();
        /// <summary>
        /// Formulario principal del maestro (Debe ser el primero en ser registrado).
        /// </summary>
        private static Form mdiContainer = null;
        /// <summary>
        /// Agregar un nuevo formulario a la lista.
        /// </summary>
        /// <param name="form">Formulario a agregar.</param>
        public static bool addNewForm(Form form, bool isEmergente){
            if (form.IsMdiContainer && Maestro_Proveedores.herramientas.Redirect.MdiContainer == null)
            {
                Maestro_Proveedores.herramientas.Redirect.mdiContainer = form;
                Redirect.formulariosInParent.Add(form);
                return true;
            }
            else if (form.IsMdiContainer && Maestro_Proveedores.herramientas.Redirect.MdiContainer != null)
            {
                MessageBox.Show("Ya existe un Form.MdiContainer.\nEl formulario no puede ser agregado.");
                return false;
            }
            else if (Maestro_Proveedores.herramientas.Redirect.MdiContainer == null)
            {
                MessageBox.Show("Aun no se ha definido un Form.MdiContainer.\nEl formulario no puede ser agregado.");
                return false;
            }
            else
            {
                //--verificar si ya el formulario esta registrado en la lista.
                foreach (Form f in Maestro_Proveedores.herramientas.Redirect.formulariosInParent)
                {
                    //--- si esta registrado... no tengo que hacer mas nada
                    if (f.Name.Equals(form.Name))
                    {
                        MessageBox.Show("El formulario " + form.Name + " Ya esta registrado en la lista de Formularios.");
                        return true;
                    }
                }
                //--asignarle el MdiContainer, solo si no es una ventana emergente
                if (!isEmergente)
                {
                    form.MdiParent = Maestro_Proveedores.herramientas.Redirect.MdiContainer;
                }
                //--agregar el formulario a la lista
                Maestro_Proveedores.herramientas.Redirect.formulariosInParent.Add(form);
                //--agregar el FormClosing() al formulario, esto es para evitarq eu se cierre.
                form.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Maestro_Proveedores.herramientas.Redirect.FormClosing);
                return true;
            }
        }
        /// <summary>
        /// Agregar un nuevo formulario a la lista.
        /// </summary>
        /// <param name="form">Formulario a agregar.</param>
        public static bool addNewForm(Form form)
        {
            return Redirect.addNewForm(form, false);
        }
        /// <summary>
        /// mostrar un formulario. Si no esta registrado, lo instancia y lo registra.
        /// </summary>
        /// <param name="target">Nombre del formulario</param>
        public static void open(String target)
        {
            try
            {   
                Boolean ok = false;
                Form temp = null;
                //--- verificio si el formulario ya fue creado...
                foreach (Form f in Maestro_Proveedores.herramientas.Redirect.formulariosInParent)
                {
                    if (f.Name.Equals(target))
                    {
                        ok = true;
                        temp = f;
                    }
                }
                //--- si ya fue creado, entonces lo muestro
                if (ok)
                {
                    if (temp.Visible)
                    {
                        //temp.WindowState = FormWindowState.Normal;
                        temp.BringToFront();
                    }
                    else 
                    {
                        //temp.WindowState = FormWindowState.Normal; 
                        temp.Visible = true;
                    }                    
                }
                //--- si no fue creado,lo creo, lo registro y lo muestro
                else
                {
                    Assembly ensamblado = System.Reflection.Assembly.LoadFrom(Application.ExecutablePath); //si es la aplicacion en curso
                    Type tipos;
                    tipos = ensamblado.GetType("Maestro_Proveedores.Forms." + target);
                    temp = ((Form)(Activator.CreateInstance(tipos, true)));
                    Maestro_Proveedores.herramientas.Redirect.addNewForm(temp);
                    temp.Visible=true;                    
                }
            }
            catch (Exception ex)
            {
                Maestro_Proveedores.herramientas.MessageException.show(ex);
            }
        }
        /// <summary>
        /// Obtener un formulario de la lista. Si no esta registrado, lo instancia y lo registra.
        /// </summary>
        /// <param name="nombreFormulario">Nombre del formulario</param>
        /// <returns>Instancia del formulario</returns>
        public static Form getFormulario(String nombreFormulario)
        {
            foreach (Form f in Maestro_Proveedores.herramientas.Redirect.formulariosInParent)
                if (f.Name.Equals(nombreFormulario))
                    return f;
            try
            {
                //--- si no fue creado,lo creo y lo registro
                Assembly ensamblado = System.Reflection.Assembly.LoadFrom(Application.ExecutablePath); //si es la aplicacion en curso
                Type tipos;
                tipos = ensamblado.GetType("Maestro_Proveedores.Forms." + nombreFormulario);
                Form temp = ((Form)(Activator.CreateInstance(tipos, true)));
                Maestro_Proveedores.herramientas.Redirect.addNewForm(temp);
                return temp;
            }
            catch (Exception) 
            {
                return null;
            }            
        }
        /// <summary>
        /// Cerrar todos los formularios abiertos. Este metodo finaliza la aplicación.
        /// </summary>
        public static void closeAllForms()
        {
            try
            {
                foreach (Form f in Maestro_Proveedores.herramientas.Redirect.formulariosInParent)
                {
                    if (!f.IsMdiContainer)
                    {
                        if (f.WindowState != FormWindowState.Minimized)
                        {
                            f.WindowState = FormWindowState.Minimized;
                            f.Close();
                        }
                        else
                        {
                            f.Close();
                        }                        
                    }
                }
                Maestro_Proveedores.herramientas.Redirect.mdiContainer.Close();
            }
            catch(Exception ex)
            {
                Maestro_Proveedores.herramientas.MessageException.show(ex);
            }
        }
        /// <summary>
        /// Obtiene el formulario princiapal de la aplicacion.
        /// </summary>
        public static Form MdiContainer
        {
            get { return Redirect.mdiContainer; }
            //set { Redirect.mdiContainer = value; }
        }        
        /// <summary>
        /// en vez de cerrar un formulario, lo oculto.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public static void FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!((Form)sender).IsMdiContainer)
            {
                e.Cancel = true;
                ((Form)sender).Visible=false;                
            }
        }        
    }
}
